home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / haeberli / compexp / compexp.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  8KB  |  354 lines

  1. /*
  2.  * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. /*
  18.  *    comp -
  19.  *        A compression explorer.
  20.  *
  21.  *                Paul Haeberli - 1991
  22.  */
  23. #include "stdio.h"
  24. #include "gl.h"
  25. #include "device.h"
  26. #include "resource.h"
  27. #include "showcaseui.h"
  28.  
  29. int compdecomp();
  30. int compress(unsigned long *lbuf, int ixsize, int iysize, 
  31.           unsigned char *cbuf, int cbuflen, int thchroma, int thflat, int thedge);
  32. void decompress(unsigned char *cbuf, unsigned long *lbuf, int doblend);
  33. float getvalval();
  34.  
  35. #define IM        (2)
  36. #define DRAW_BACK    (0x1)
  37. #define DRAW_IMAGE    (0x2)
  38.  
  39. #define SCALE_CHROMA    (120)    /* default 30 */
  40. #define SCALE_FLAT    (200)    /* default 15 */
  41. #define SCALE_EDGE    (200)    /* default 45 */
  42.  
  43. Button        *quitbut;
  44. Button        *mainbed;
  45. TextBox        *tbchroma, *tbflat, *tbedge, *tbbpp;
  46. Valuator    *vthchroma, *vthflat, *vthedge;
  47.  
  48. long        xorg, yorg;
  49. unsigned long     *orig;
  50. unsigned long     *comp;
  51. int         ixsize, iysize;
  52. int         cxsize, cysize;
  53. int         dxsize, dysize;
  54. int         zfactor;
  55. int         debug = 1;
  56.  
  57. main(argc, argv)
  58. int argc;
  59. char **argv;
  60. {
  61.     long    dev, mx, my;
  62.     short    val, smx, smy;
  63.     FILE     *inf;
  64.  
  65.     if(argc<2) {
  66.     inf = res_fopen("#t.rgb");
  67.     if(inf) {
  68.         res_fclose(inf);
  69.         initialize("#t.rgb");
  70.     } else {
  71.         fprintf(stderr,"usage: comp in.rgb\n");
  72.         exit(1);
  73.     }
  74.     } else {
  75.     initialize(argv[1]);
  76.     }
  77.     activate();
  78.     drawscene(DRAW_BACK|DRAW_IMAGE);
  79.     
  80.     while (1) {
  81.     switch (dev = qread(&val)) {
  82.         case LEFTMOUSE:
  83.         qread(&smx); qread(&smy);
  84.         mx = smx - xorg;
  85.         my = smy - yorg;
  86.         if (val == UIBUTTONDOWN) {
  87.             sginap(8);
  88.             if (qtest() == dev) {
  89.             short tmp;
  90.             qread(&tmp); qread(&tmp); qread(&tmp);
  91.             val = UIBUTTONCLICK;
  92.             }
  93.         }
  94.         if (handleevents(mx, my, dev, (long) val))
  95.             drawscene(DRAW_IMAGE);
  96.         break;
  97.         case MOUSEX:
  98.         mx = val - xorg;
  99.         break;
  100.         case MOUSEY:
  101.         my = val - yorg;
  102.         locatemouseevents(mx,my);
  103.         break;
  104.         case REDRAW:
  105.         getorigin(&xorg,&yorg);
  106.         drawscene(DRAW_BACK|DRAW_IMAGE);
  107.         break;
  108.     }
  109.     }
  110. }
  111.  
  112. long conx, cony, conhi;
  113.  
  114. initialize(iname)
  115. char *iname;
  116. {
  117.     long xsize, ysize;
  118.     long tmp, xmax, ymax;
  119.  
  120.     sizeofimage(iname,&ixsize,&iysize);
  121.     zfactor = 3;
  122.  
  123.     xmax = getgdesc(GD_XPMAX)-250;
  124.     ymax = getgdesc(GD_YPMAX)-70;
  125.     while(ixsize*zfactor > xmax || iysize*zfactor > ymax)
  126.     zfactor--;
  127.     if(zfactor <= 0)
  128.     zfactor = 1;
  129.  
  130.     cxsize = 4*(ixsize/4);
  131.     cysize = 4*(iysize/4);
  132.     dxsize = cxsize*zfactor;
  133.     dysize = cysize*zfactor;
  134.  
  135.     xsize = dxsize+3*60+20;
  136.     ysize = dysize+20;
  137.     if(ysize<410)
  138.     ysize = 410;
  139.     conx = dxsize+30;
  140.     cony = 40;
  141.     conhi = 270;
  142.  
  143.     ymax = 300;
  144.     quitbut = newpushbut(xsize-10-75,10);
  145.  
  146.     vthchroma = newval(conx+0*60,cony+40,cony+conhi,0,15,0);
  147.     vthflat = newval(conx+1*60,cony+40,cony+conhi,0,15,0);
  148.     vthedge = newval(conx+2*60,cony+40,cony+conhi,0,15,0);
  149.  
  150.     tbchroma = newtb(vthchroma->xmin-7,cony+10,vthchroma->xmin+28);
  151.     tbflat = newtb(vthflat->xmin-7,cony+10,vthflat->xmin+28);
  152.     tbedge = newtb(vthedge->xmin-7,cony+10,vthedge->xmin+28);
  153.     tbbpp = newtb(conx+90,conhi+cony+30,conx+150);
  154.  
  155.     tmp = (long) ((vthedge->ymax - vthedge->ymin)/2 + vthedge->ymin);
  156.     mainbed = newbed(10-IM,10-IM,10+dxsize+IM-1,10+dysize+IM-1);
  157.  
  158.     autoprefsize(xsize,ysize);
  159.     winopen("Compression Explorer");
  160.     getorigin(&xorg,&yorg);
  161.  
  162.     RGBmode();
  163.     gconfig();
  164.     cpack(0xe0e0e0);
  165.     clear();
  166.     frontbuffer(0);
  167.     orig = (unsigned long *)longimagedata(iname);
  168. }
  169.  
  170. activate()
  171. {
  172.     initbut();
  173.     inittb();
  174.  
  175.     qdevice(LEFTMOUSE);
  176.     qdevice(MOUSEX);
  177.     qdevice(MOUSEY);
  178.     tie(LEFTMOUSE, MOUSEX, MOUSEY);
  179.  
  180.     loadbut(quitbut,"Quit");
  181.     enableval(vthchroma);
  182.     enableval(vthflat);
  183.     enableval(vthedge);
  184.     loadtb(tbchroma,"10");
  185.     loadtb(tbflat,"5");
  186.     loadtb(tbedge,"20");
  187.     loadtb(tbbpp,"0.0");
  188. }
  189.  
  190. int followslider(long val, long my, Valuator *slider, Valuator *link, int cmp)
  191. {
  192.     int oy;
  193.  
  194.     oy = -1000;
  195.     if (val == UIBUTTONUP) return 0;
  196.     handleval(slider, LEFTMOUSE, val);
  197.     handleval(slider, MOUSEY, my+yorg);
  198.     while ((getbutton(LEFTMOUSE)) || (val == UIBUTTONCLICK)) {
  199.     my = getvaluator(MOUSEY);
  200.     if(my != oy) {
  201.         oy = my;
  202.         handleval(slider, MOUSEY, my);
  203.         drawval(slider);
  204.         if(link && cmp*getvalval(slider)<cmp*getvalval(link)) {
  205.         handleval(link, MOUSEY, my);
  206.         drawval(link);
  207.         }
  208.         updateallnumbers();
  209.         val = UIBUTTONUP;
  210.     }
  211.     }
  212.     handleval(slider, LEFTMOUSE, val);
  213.     if(link)
  214.     handleval(link, LEFTMOUSE, my);
  215.     updateallnumbers();
  216.     return 1;
  217. }
  218.  
  219. handleevents(long mx, long my, long dev, long val)
  220. {
  221.     if (selectedpressbut(quitbut,mx,my,val)) {
  222.     exit(0);
  223.     } else if (inval(vthchroma, mx, my)) {
  224.     return followslider(val,my,vthchroma,0,0);
  225.     } else if (inval(vthflat, mx, my)) {
  226.     return followslider(val,my,vthflat,vthedge,-1);
  227.     } else if (inval(vthedge, mx, my)) {
  228.     return followslider(val,my,vthedge,vthflat,1);
  229.     } else
  230.     return 0;
  231. }
  232.  
  233. updatenumber(v,t,scaleval)
  234. Valuator *v;
  235. TextBox *t;
  236. int scaleval;
  237. {
  238.     char c[128];
  239.     int i;
  240.  
  241.     i = scaleval*getvalval(v)+0.5;
  242.     sprintf(c,"%3d",i);
  243.     loadtb(t,c);
  244. }
  245.  
  246. updateallnumbers()
  247. {
  248.     updatenumber(vthchroma,tbchroma,SCALE_CHROMA);
  249.     updatenumber(vthflat,tbflat,SCALE_FLAT);
  250.     updatenumber(vthedge,tbedge,SCALE_EDGE);
  251.     drawtb(tbflat);
  252.     drawtb(tbchroma);
  253.     drawtb(tbedge);
  254. }
  255.  
  256. float bpp;
  257.  
  258. drawscene(how)
  259. int how;
  260. {
  261.     char c[4];
  262.     char str[128];
  263.     long thchroma, thflat, thedge;
  264.     long tmp;
  265.  
  266.     if(how & DRAW_BACK) {
  267.     cpack(0xd5d5d5);
  268.     clear();
  269.     }
  270.     drawbut(quitbut);
  271.     drawval(vthchroma);
  272.     drawval(vthflat);
  273.     drawval(vthedge);
  274.     drawboldlabel("chroma",vthchroma->xmin-14,vthchroma->ymax+10);
  275.     drawboldlabel("flat",vthflat->xmin,vthflat->ymax+10);
  276.     drawboldlabel("edge",vthedge->xmin-5,vthedge->ymax+10);
  277.     drawboldlabel("Bits Per Pix:",conx-10,cony+conhi+39);
  278.     sprintf(str,"Zoom factor: %d",zfactor);
  279.     drawboldlabel(str,conx-10,cony+conhi+39+30);
  280.  
  281.     drawborder(mainbed);
  282.     if(how & DRAW_IMAGE)
  283.     drawmyimage(mainbed,getvalval(vthchroma),getvalval(vthflat),getvalval(vthedge));
  284.  
  285.     updateallnumbers();
  286.     sprintf(c,"%3f",bpp);
  287.     loadtb(tbbpp,c);
  288.     drawtb(tbbpp);
  289. }
  290.  
  291. float cchroma, cflat, cedge;
  292.  
  293. drawmyimage(b,fc,ff,fe)
  294. Button *b;
  295. float ff, fc, fe;
  296. {
  297.     int thf, thc, the;
  298.  
  299.     if(ff != cflat || fc != cchroma || fe != cedge) {
  300.     percentdone(50.0);
  301.     if(!comp) 
  302.         comp = (unsigned long *)malloc(cxsize*cysize*sizeof(long));
  303.     thc = SCALE_CHROMA*fc+0.5;
  304.     thf = SCALE_FLAT*ff+0.5;
  305.     the = SCALE_EDGE*fe+0.5;
  306.     bpp = compdecomp(orig,ixsize,iysize,comp,thc,thf,the);
  307.     bpp = bpp*8/(ixsize*iysize);
  308.     cchroma = fc;
  309.     cflat = ff;
  310.     cedge = fe;
  311.     percentdone(100.0);
  312.     }
  313.     rectzoom((float)zfactor,(float)zfactor);
  314.     lrectwrite(IM+b->xmin,IM+b->ymin,IM+b->xmin+cxsize-1,IM+b->ymin+cysize-1,comp);
  315. }
  316.  
  317. long lastmx, lastmy;
  318.  
  319. locatemouseevents(long mx, long my)
  320. {
  321.     if ((mx == lastmx) && (my == lastmy))
  322.     return;
  323.     locatebut(quitbut,mx,my);
  324.     locateval(vthchroma,mx,my);
  325.     locateval(vthflat,mx,my);
  326.     locateval(vthedge,mx,my);
  327. }
  328.  
  329. /*
  330.  *    compression stuff follows
  331.  *
  332.  */
  333. unsigned char *cbuf;
  334. int cbuflen;
  335.  
  336. int compdecomp(orig,ixsize,iysize,comp,thc,thf,the)
  337. unsigned long *orig;
  338. int ixsize, iysize;
  339. unsigned long *comp;
  340. int thc, thf, the;
  341. {
  342.     int buflen;
  343.  
  344.     if(!cbuf) {
  345.      cbuflen = ixsize*iysize;
  346.      cbuf = (unsigned char *)malloc(cbuflen);
  347.     }
  348.     if(debug)
  349.     printf("comp params: chroma %d flat %d edge %d\n",thc,thf,the);
  350.     buflen = compress(orig,ixsize,iysize,cbuf,cbuflen,thc,thf,the);
  351.     decompress(cbuf,comp,2);
  352.     return buflen;
  353. }
  354.